# 引入必要的库
# TODO
import os
import joblib
import yaml
import numpy as np
import time
import cv2 as cv
from skimage import io
import skimage

# 获取 0_setting.yaml 中的键 key 对应的值 value
def get(key):
    # TODO
    config_file_path = './0_setting.yaml'
    if(os.path.exists(config_file_path)):
        with open(file='./0_setting.yaml', mode='r', encoding='utf-8') as f:
            all_data = yaml.load(f, Loader=yaml.Loader)
        return all_data[key]
    else:
        print(f"配置文件{config_file_path}不存在")
        return None

# 预处理图像, 把图像设置为指定大小之后，展平返回
def preprocess_image(file_name, new_size):
    # 1. 读取图像灰度图
    # TODO
    # 路径中有中文，所以使用io的imread方法读取图片
    img = io.imread(file_name, as_gray=True)
    # 归一化
    img = img / 255
    # 2. 调整图像大小为 new_size
    # TODO
    # 将图片伸缩至new_size并归一化
    img = cv.resize(img,new_size, interpolation=cv.INTER_CUBIC)
    # 3. 将图像展平为一维数组
    # TODO
    return img.ravel()

# 用joblib把叫做 name 的对象 obj 保存(序列化)到位置 loc
def dump(obj, name, loc):
    start = time.time()
    print(f"把{name}保存到{loc}") 
    # TODO 此处序列化对象
    if(os.path.exists(f'{loc}')):
        joblib.dump(obj,loc+f'/{name}')
    else:
        os.makedirs(f'{loc}')
        joblib.dump(obj,loc+f'/{name}')
    end = time.time()
    print(f"保存完毕,文件位置:{loc+f'/{name}'}, 大小:{os.path.getsize(loc+f'/{name}') / 1024 / 1024:.3f}M")
    print(f"运行时间:{end - start:.3f}秒")

# 用joblib读取(反序列化)位置loc的对象obj,对象名为name
def load(name, loc):
    print(f"从{loc}提取文件{name}")
    start = time.time()
    #TODO 此处反序列化对象
    if(os.path.exists(f'{loc}/{name}')):
        obj = joblib.load(loc + f'/{name}')
    else:
        print(f"文件{loc}/{name}不存在")
        return None
    end = time.time()
    print(f"加载完毕,文件位置:{loc}/{name}, 大小:{os.path.getsize(loc+f'/{name}') / 1024 / 1024:.3f}M")
    print(f"加载时间:{end - start:.3f}秒")
    return obj